/*
 * Str_chr 和 Str_rchr 分别从 s[i:j] 的最左侧和最右侧开始搜索字符 c ，并返回该字符的位置 .
 * Str_upto 和 Str_rupto 分别从 s[i:j] 的最左侧和最右侧开始搜索 set 中的任意字符，并返回搜索到的字符的位置 .
 * Str_find 和 Str_rfind 分别从 s[i:j] 的最左侧和最右侧开始搜索字符串 str ，并返回 s 中该子串的起始位置 .
 * Str_any 搜索字符 s[i] 是否出现在 set 中，返回该字符之后的位置 .
 * Str_many 和 Str_rmany 分别从 s[i:j] 的最左侧和最右侧开始查找 set 中一个或多个字符构成的连续序列，分别返回序列最右侧字符的右侧位置和序列最左侧字符的位置 .
 * Str_match 和 Str_rmatch 分贝从 s[i:j] 的最左侧和最右侧开始查找字符串 str ，分别返回子串的右侧位置和子串的起始位置 .
**/
#ifndef STR_INCLUDED
#define STR_INCLUDED

#include "fmt.h"

char* Str_sub(const char *s, int i, int j);
char* Str_dup(const char *s, int i, int j, int n);
char* Str_cat(const char *s1, int i1, int j1, const char *s2, int i2, int j2);
char* Str_catv(const char *s, ...);
char* Str_reverse(const char *s, int i, int j);
char* Str_map(const char *s, int i, int j, const char *from, const char *to);

int Str_pos(const char *s, int i);
int Str_len(const char *s, int i, int j);
int Str_cmp(const char *s1, int i1, int j1, const char *s2, int i2, int j2);

int Str_chr(const char *s, int i, int j, int c);
int Str_rchr(const char *s, int i, int j, int c);
int Str_upto(const char *s, int i, int j, const char *set);
int Str_rupto(const char *s, int i, int j, const char *set);
int Str_find(const char *s, int i, int j, const char *str);
int Str_rfind(const char *s, int i, int j, const char *str);

int Str_any(const char *s, int i, const char *set);
int Str_many(const char *s, int i, int j, const char *set);
int Str_rmany(const char *s, int i, int j, const char *set);
int Str_match(const char *s, int i, int j, const char *str);
int Str_rmatch(const char *s, int i, int j, const char *str);

void Str_fmt(int code, va_list_box *box,
             int put(int c, void *cl), void *cl,
             unsigned char flags[256], int width, int precision);

#endif

